package com.jgc.locksupport;

import java.util.concurrent.locks.LockSupport;

/**
 * Created by Administrator on 2022/3/20.
 * LockSupport是JDK中比较底层的类，用来创建锁和其他同步工具类的基本线程阻塞原语。
 * LockSupport很类似于二元信号量(只有1个许可证可供使用)，如果这个许可还没有被占用，当前线程获取许可并继续执行；
 * 如果许可已经被占用，当前线程阻塞，等待获取许可
 *
 * LockSupport.park()和LockSupport.unpark()实现线程的阻塞和唤醒操作的，
 * 当然实现线程间的阻塞和唤醒我们还可以用到对象锁，通过Synchronizer关键字来实现对象同步锁，使用对象的wait()和notify()方法来实现，
 * 但是此方式的实现在性能上会大打折扣而且有些并发控制不当非常容易引发线程间死锁，可以说非常不优雅
 *
 * sum:LockSupport可以用于线程间的阻塞唤醒
 * park()方法，调用native方法阻塞当前线程
 * unpark()方法，唤醒处于阻塞状态的线程Thrread
 */
public class LockSupportDemo {
    public static void main(String[] args) throws InterruptedException {
        MyThread myThread = new MyThread();
        myThread.setName("jgc");
        myThread.start();
        Thread.sleep(10);
        myThread.park();
        Thread.currentThread().sleep(10000);
        myThread.unPark();
        Thread.currentThread().sleep(10000);
        myThread.park();
    }

    static class MyThread extends Thread{
        private boolean isPark = false;
        @Override
        public void run() {
            while (true){
                if(isPark){
                    System.out.printf(Thread.currentThread().getName() + "Thread is Park:");
                    LockSupport.park(this);
                }
                System.out.println("%>> is running" + Thread.currentThread().getName());
                try {
                    sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        public void park(){
            isPark = true;
        }
        public void unPark() {
            isPark = false;
            LockSupport.unpark(this);
            System.out.println("Thread is unpark.....");
        }
    }
}
